home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Source Code / MAP Viewer / Frustum.cpp < prev    next >
C/C++ Source or Header  |  2003-10-09  |  9KB  |  166 lines

  1. /*
  2. Half-Life MAP viewing utility.
  3. Copyright (C) 2003  Ryan Samuel Gregg
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. */
  19.  
  20. #include "stdafx.h"
  21. #include "Frustum.h"
  22.  
  23. CFrustum::CFrustum()
  24. {
  25.     fAspect = 1.0f;
  26.  
  27.     fWidth = 1.0f;
  28.     fHeight = 1.0f;
  29. }
  30.  
  31. void CFrustum::CalculateFrustum()
  32. {
  33.     float proj[16]; // Projection matrix.
  34.     float modl[16]; // Modelview matrix.
  35.     float clip[16]; // Clipping planes.
  36.     float fMagnitude;
  37.  
  38.     glGetFloatv(GL_PROJECTION_MATRIX, proj);
  39.     glGetFloatv(GL_MODELVIEW_MATRIX, modl);
  40.  
  41.     // Combine two matrices to get clipping plane.
  42.     clip[ 0] = modl[ 0] * proj[ 0] + modl[ 1] * proj[ 4] + modl[ 2] * proj[ 8] + modl[ 3] * proj[12];
  43.     clip[ 1] = modl[ 0] * proj[ 1] + modl[ 1] * proj[ 5] + modl[ 2] * proj[ 9] + modl[ 3] * proj[13];
  44.     clip[ 2] = modl[ 0] * proj[ 2] + modl[ 1] * proj[ 6] + modl[ 2] * proj[10] + modl[ 3] * proj[14];
  45.     clip[ 3] = modl[ 0] * proj[ 3] + modl[ 1] * proj[ 7] + modl[ 2] * proj[11] + modl[ 3] * proj[15];
  46.  
  47.     clip[ 4] = modl[ 4] * proj[ 0] + modl[ 5] * proj[ 4] + modl[ 6] * proj[ 8] + modl[ 7] * proj[12];
  48.     clip[ 5] = modl[ 4] * proj[ 1] + modl[ 5] * proj[ 5] + modl[ 6] * proj[ 9] + modl[ 7] * proj[13];
  49.     clip[ 6] = modl[ 4] * proj[ 2] + modl[ 5] * proj[ 6] + modl[ 6] * proj[10] + modl[ 7] * proj[14];
  50.     clip[ 7] = modl[ 4] * proj[ 3] + modl[ 5] * proj[ 7] + modl[ 6] * proj[11] + modl[ 7] * proj[15];
  51.  
  52.     clip[ 8] = modl[ 8] * proj[ 0] + modl[ 9] * proj[ 4] + modl[10] * proj[ 8] + modl[11] * proj[12];
  53.     clip[ 9] = modl[ 8] * proj[ 1] + modl[ 9] * proj[ 5] + modl[10] * proj[ 9] + modl[11] * proj[13];
  54.     clip[10] = modl[ 8] * proj[ 2] + modl[ 9] * proj[ 6] + modl[10] * proj[10] + modl[11] * proj[14];
  55.     clip[11] = modl[ 8] * proj[ 3] + modl[ 9] * proj[ 7] + modl[10] * proj[11] + modl[11] * proj[15];
  56.  
  57.     clip[12] = modl[12] * proj[ 0] + modl[13] * proj[ 4] + modl[14] * proj[ 8] + modl[15] * proj[12];
  58.     clip[13] = modl[12] * proj[ 1] + modl[13] * proj[ 5] + modl[14] * proj[ 9] + modl[15] * proj[13];
  59.     clip[14] = modl[12] * proj[ 2] + modl[13] * proj[ 6] + modl[14] * proj[10] + modl[15] * proj[14];
  60.     clip[15] = modl[12] * proj[ 3] + modl[13] * proj[ 7] + modl[14] * proj[11] + modl[15] * proj[15];
  61.     
  62.     mFrustum[0][0] = clip[ 3] - clip[ 0];
  63.     mFrustum[0][1] = clip[ 7] - clip[ 4];
  64.     mFrustum[0][2] = clip[11] - clip[ 8];
  65.     mFrustum[0][3] = clip[15] - clip[12];
  66.  
  67.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[0][0] * mFrustum[0][0] + mFrustum[0][1] * mFrustum[0][1] + mFrustum[0][2] * mFrustum[0][2]));
  68.     mFrustum[0][0] *= fMagnitude;
  69.     mFrustum[0][1] *= fMagnitude;
  70.     mFrustum[0][2] *= fMagnitude;
  71.     mFrustum[0][3] *= fMagnitude;
  72.  
  73.     mFrustum[1][0] = clip[ 3] + clip[ 0];
  74.     mFrustum[1][1] = clip[ 7] + clip[ 4];
  75.     mFrustum[1][2] = clip[11] + clip[ 8];
  76.     mFrustum[1][3] = clip[15] + clip[12];
  77.  
  78.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[1][0] * mFrustum[1][0] + mFrustum[1][1] * mFrustum[1][1] + mFrustum[1][2] * mFrustum[1][2]));
  79.     mFrustum[1][0] *= fMagnitude;
  80.     mFrustum[1][1] *= fMagnitude;
  81.     mFrustum[1][2] *= fMagnitude;
  82.     mFrustum[1][3] *= fMagnitude;
  83.  
  84.     mFrustum[2][0] = clip[ 3] + clip[ 1];
  85.     mFrustum[2][1] = clip[ 7] + clip[ 5];
  86.     mFrustum[2][2] = clip[11] + clip[ 9];
  87.     mFrustum[2][3] = clip[15] + clip[13];
  88.  
  89.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[2][0] * mFrustum[2][0] + mFrustum[2][1] * mFrustum[2][1] + mFrustum[2][2] * mFrustum[2][2]));
  90.     mFrustum[2][0] *= fMagnitude;
  91.     mFrustum[2][1] *= fMagnitude;
  92.     mFrustum[2][2] *= fMagnitude;
  93.     mFrustum[2][3] *= fMagnitude;
  94.  
  95.     mFrustum[3][0] = clip[ 3] - clip[ 1];
  96.     mFrustum[3][1] = clip[ 7] - clip[ 5];
  97.     mFrustum[3][2] = clip[11] - clip[ 9];
  98.     mFrustum[3][3] = clip[15] - clip[13];
  99.  
  100.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[3][0] * mFrustum[3][0] + mFrustum[3][1] * mFrustum[3][1] + mFrustum[3][2] * mFrustum[3][2]));
  101.     mFrustum[3][0] *= fMagnitude;
  102.     mFrustum[3][1] *= fMagnitude;
  103.     mFrustum[3][2] *= fMagnitude;
  104.     mFrustum[3][3] *= fMagnitude;
  105.  
  106.     mFrustum[4][0] = clip[ 3] - clip[ 2];
  107.     mFrustum[4][1] = clip[ 7] - clip[ 6];
  108.     mFrustum[4][2] = clip[11] - clip[10];
  109.     mFrustum[4][3] = clip[15] - clip[14];
  110.  
  111.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[4][0] * mFrustum[4][0] + mFrustum[4][1] * mFrustum[4][1] + mFrustum[4][2] * mFrustum[4][2]));
  112.     mFrustum[4][0] *= fMagnitude;
  113.     mFrustum[4][1] *= fMagnitude;
  114.     mFrustum[4][2] *= fMagnitude;
  115.     mFrustum[4][3] *= fMagnitude;
  116.  
  117.     mFrustum[5][0] = clip[ 3] + clip[ 2];
  118.     mFrustum[5][1] = clip[ 7] + clip[ 6];
  119.     mFrustum[5][2] = clip[11] + clip[10];
  120.     mFrustum[5][3] = clip[15] + clip[14];
  121.  
  122.     fMagnitude = 1.0f / (float)(Math::Sqrt(mFrustum[5][0] * mFrustum[5][0] + mFrustum[5][1] * mFrustum[5][1] + mFrustum[5][2] * mFrustum[5][2]));
  123.     mFrustum[5][0] *= fMagnitude;
  124.     mFrustum[5][1] *= fMagnitude;
  125.     mFrustum[5][2] *= fMagnitude;
  126.     mFrustum[5][3] *= fMagnitude;
  127. }
  128.  
  129. bool CFrustum::PointInFrustum(Vertex3f vPoint)
  130. {
  131.     if (mFrustum[0][0] * vPoint.X + mFrustum[0][1] * vPoint.Y + mFrustum[0][2] * vPoint.Z + mFrustum[0][3] <= 0) { return(true); }
  132.     if (mFrustum[1][0] * vPoint.X + mFrustum[1][1] * vPoint.Y + mFrustum[1][2] * vPoint.Z + mFrustum[1][3] <= 0) { return(true); }
  133.     if (mFrustum[2][0] * vPoint.X + mFrustum[2][1] * vPoint.Y + mFrustum[2][2] * vPoint.Z + mFrustum[2][3] <= 0) { return(true); }
  134.     if (mFrustum[3][0] * vPoint.X + mFrustum[3][1] * vPoint.Y + mFrustum[3][2] * vPoint.Z + mFrustum[3][3] <= 0) { return(true); }
  135.     if (mFrustum[4][0] * vPoint.X + mFrustum[4][1] * vPoint.Y + mFrustum[4][2] * vPoint.Z + mFrustum[4][3] <= 0) { return(true); }
  136.     if (mFrustum[5][0] * vPoint.X + mFrustum[5][1] * vPoint.Y + mFrustum[5][2] * vPoint.Z + mFrustum[5][3] <= 0) { return(true); }
  137.     return false;
  138. }
  139.  
  140. bool CFrustum::SphereInFrustum(BoundingSphere Sphere)
  141. {
  142.     if(mFrustum[0][0] * Sphere.vOrigin.X + mFrustum[0][1] * Sphere.vOrigin.Y + mFrustum[0][2] * Sphere.vOrigin.Z + mFrustum[0][3] <= -Sphere.fRadius) { return(false); }
  143.     if(mFrustum[1][0] * Sphere.vOrigin.X + mFrustum[1][1] * Sphere.vOrigin.Y + mFrustum[1][2] * Sphere.vOrigin.Z + mFrustum[1][3] <= -Sphere.fRadius) { return(false); }
  144.     if(mFrustum[2][0] * Sphere.vOrigin.X + mFrustum[2][1] * Sphere.vOrigin.Y + mFrustum[2][2] * Sphere.vOrigin.Z + mFrustum[2][3] <= -Sphere.fRadius) { return(false); }
  145.     if(mFrustum[3][0] * Sphere.vOrigin.X + mFrustum[3][1] * Sphere.vOrigin.Y + mFrustum[3][2] * Sphere.vOrigin.Z + mFrustum[3][3] <= -Sphere.fRadius) { return(false); }
  146.     if(mFrustum[4][0] * Sphere.vOrigin.X + mFrustum[4][1] * Sphere.vOrigin.Y + mFrustum[4][2] * Sphere.vOrigin.Z + mFrustum[4][3] <= -Sphere.fRadius) { return(false); }
  147.     if(mFrustum[5][0] * Sphere.vOrigin.X + mFrustum[5][1] * Sphere.vOrigin.Y + mFrustum[5][2] * Sphere.vOrigin.Z + mFrustum[5][3] <= -Sphere.fRadius) { return(false); }
  148.     return true;
  149. }
  150.  
  151. bool CFrustum::CubeInFrustum(BoundingBox Box)
  152. {
  153.     for(int i = 0; i < 6; i++)
  154.     {
  155.         if(mFrustum[i][0] * Box.vNegBound.X + mFrustum[i][1] * Box.vNegBound.Y + mFrustum[i][2] * Box.vNegBound.Z + mFrustum[i][3] > 0) { continue; }
  156.         if(mFrustum[i][0] * Box.vPosBound.X + mFrustum[i][1] * Box.vNegBound.Y + mFrustum[i][2] * Box.vNegBound.Z + mFrustum[i][3] > 0) { continue; }
  157.         if(mFrustum[i][0] * Box.vNegBound.X + mFrustum[i][1] * Box.vPosBound.Y + mFrustum[i][2] * Box.vNegBound.Z + mFrustum[i][3] > 0) { continue; }
  158.         if(mFrustum[i][0] * Box.vPosBound.X + mFrustum[i][1] * Box.vPosBound.Y + mFrustum[i][2] * Box.vNegBound.Z + mFrustum[i][3] > 0) { continue; }
  159.         if(mFrustum[i][0] * Box.vNegBound.X + mFrustum[i][1] * Box.vNegBound.Y + mFrustum[i][2] * Box.vPosBound.Z + mFrustum[i][3] > 0) { continue; }
  160.         if(mFrustum[i][0] * Box.vPosBound.X + mFrustum[i][1] * Box.vNegBound.Y + mFrustum[i][2] * Box.vPosBound.Z + mFrustum[i][3] > 0) { continue; }
  161.         if(mFrustum[i][0] * Box.vNegBound.X + mFrustum[i][1] * Box.vPosBound.Y + mFrustum[i][2] * Box.vPosBound.Z + mFrustum[i][3] > 0) { continue; }
  162.         if(mFrustum[i][0] * Box.vPosBound.X + mFrustum[i][1] * Box.vPosBound.Y + mFrustum[i][2] * Box.vPosBound.Z + mFrustum[i][3] > 0) { continue; }
  163.         return false;
  164.     }
  165.     return true;
  166. }